package main

import "fmt"

type People struct {
	Name    string
	Age     int
	Address string
	Gender  string
}

func (p *People) getInfo() string {
	//结构体方法接收者类型

	//指针接收者：方法作用于类型的指针。可以直接修改原始实例的字段。
	//值接收者：方法作用于类型的值副本。如果在方法中修改了接收者的字段，原始实例不会受到影响。
	p.Name = "Tom"
	return fmt.Sprintf("Name: %s, Age: %d, Address: %s, Gender: %s", p.Name, p.Age, p.Address, p.Gender)

}

func (p *People) Eat(food string) {
	fmt.Printf("%s is eating %s\n", p.Name, food)

}

//getInfo 只能在本包内使用，如果想在其他包中使用，则需要将首字母大写。
//Eat 可以在其他包中使用。

func main() {

	// var p People = People{"Tom", 20, "Beijing", "Male"}
	var p2 People = People{Name: "Jerry", Age: 22, Address: "Hangzhou", Gender: "FeMale"}
	//给自定义类型创建一个方法，用来打印用户信息
	// func 函数名称() (返回值){}
	// func (p *People) PrintInfo() (返回值){}
	// p 操作变量里面的数据
	info := p2.getInfo()
	fmt.Println(info)
	fmt.Println(p2)
	p2.Eat("Apple")

}
